import { mergeOptions } from "./utils";

export function initGlobalApi(Vue) {
  Vue.options = {
    _base:Vue
  };
  Vue.mixin = function (mixin) {
    // 合并mixin和options
    // {create:()=>{}}和{}合并成{create:[fn]}
    this.options = mergeOptions(this.options, mixin);
    return this;
  }

  // 就是根据用户的参数返回一个构造函数实例而已
  Vue.extend = function(options){
    // 最终使用一个组件,就是new一个实例
    function Sub(options={}){
      // 对子类进行初始化
      this._init(options);
    }
    // 保存用户选项,把传的和全局的合并一下
    Sub.options = mergeOptions(Vue.options,options);
    // 为sub添加vue原型方法
    Sub.prototype = Object.create(Vue.prototype);
    Sub.prototype.constructor = Sub;
    return Sub;
  }

  // 维护全局的组件
  Vue.options.components = {};
  Vue.component = function(id,definition){
    // 要把definition包一个extend,但是用户有可能自己手动加了,判断一下
    definition = typeof definition === 'function' ? definition : Vue.extend(definition);
    Vue.options.components[id] = definition;
  }
}
